package br.com.clubelivro.bo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import gov.sefaz.framework.modelo.BaseBO;
import gov.sefaz.framework.persistencia.IBaseDAO;
import gov.sefaz.utils.exception.BaseException;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.clubelivro.bo.iface.IPagamentoBO;
import br.com.clubelivro.dao.iface.IClubeLivroDAO;
import br.com.clubelivro.modelo.Pagamento;
import br.com.clubelivro.modelo.Socio;


@Stateless
@Local(IPagamentoBO.class)
public class PagamentoBO extends BaseBO<Pagamento> implements IPagamentoBO {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@EJB
	private IClubeLivroDAO<Pagamento> dao;
	
	@Override
	public IBaseDAO<Pagamento> getDAOPadrao() {
		return dao;
	}

	@Override
	protected void gravarAntes(Pagamento entidade) throws BaseException {
		entidade.setData(new Date());
	}
	
	/**
	 * Recebe a lista de socios e faz o pagamento para cada um
	 * @param selecaoSocio
	 * @param pagamento
	 * @throws BaseException
	 */
	public List<Pagamento> gravarPagamento(List<Socio> selecaoSocio, Pagamento pagamento) throws BaseException{
		List<Pagamento> retorno = new ArrayList<Pagamento>();
		for (Socio socio : selecaoSocio) {
			if(!existePagamento(socio, pagamento)){
				Pagamento pg = new Pagamento();
				pg.setAno(pagamento.getAno());
				pg.setMes(pagamento.getMes());
				pg.setValor(pagamento.getValor());
				pg.setSocio(socio);
				gravar(pg);
				retorno.add(pg);
			}
		}
		return retorno;
	}
	
	/**
	 * Verifica se existe algum pagamento lançado para o sócio no mês e ano passados.
	 * @param socio
	 * @param pagamento
	 * @return
	 */
	private Boolean existePagamento(Socio socio, Pagamento pagamento){
		Boolean existe = false;
		try {
			Long contador = (Long) buscarCount("Pagamento.countPorSocioMesAno", new Object[]{socio.getId(), pagamento.getMes(), pagamento.getAno()});
			if(contador != null && contador.compareTo(0L) > 0){
				existe = true;
			}
		} catch (BaseException e) {
			e.printStackTrace();
		}
		
		return existe;
	}

}
